altered significantly to obtain the desired functionality, the programmer should instead derive a new class.
On the other hand, the programmer should inspect the structure of any new class to determine whether a more general "abstract" class (of which an object is never defined) can instead be defined. The desired class may then be derived from the more general class, which itself has a greater likelyhood of reuse in future programming efforts. This approach also helps simplify future maintentance of the application.
Abstract classes in turn may derive from still more general classes, to create a tree-shaped class hierarchy. (The multiple inheritance property of C++ v.2.0 allows non-tree-shaped structures.) Often all classes used in an application are derived from a single "root" class, such as the Generic_Class used in the example in Chapter 4. This simplifies changing certain basic characteristics which are common to all classes.
A collection of related general-purpose classes may be organized to form a class library* for use in future programming efforts. This sort of library may be distri- buted in precompiled modules rather than in the form of source code. Interestingly,